const Ajv = require('ajv');
const ajv = new Ajv({ allErrors: true });

// 引入 ajv-errors 插件
require('ajv-errors')(ajv);

// 定义 JSON Schema
const schema = {
    type: 'object',
    properties: {
        name: { type: 'string' },
        age: { type: 'integer', minimum: 18 },
    },
    required: ['name', 'age'],
};

// 自定义错误消息
ajv.addKeyword('customMessage', {
    macro(schema, parentSchema, it) {
        it.errors = it.errors || [];
        const customMessage = schema.customMessage || 'Custom error message';
        it.errors.push({
            keyword: 'customMessage',
            message: customMessage,
            params: {},
        });
        return true;
    },
});

// 在属性上使用自定义错误消息
schema.properties.name.customMessage = '姓名应该是字符串';
schema.properties.age.customMessage = '年龄应该至少为18岁';

// 编译 JSON Schema
const validate = ajv.compile(schema);

// 数据示例
const data = {
    name: 123,
    age: 15,
};

// 验证数据是否符合 JSON Schema
const isValid = validate(data);

if (isValid) {
    console.log('数据有效!');
} else {
    console.error('数据无效!');
    console.error(translateErrors(validate.errors));
}

// 汉化错误消息
function translateErrors(errors) {
    return errors.map(error => {
        switch (error.keyword) {
            case 'type':
                error.message = '类型错误';
                break;
            case 'minimum':
                error.message = '值太小';
                break;
            // 添加其他关键字的翻译...
        }
        return error;
    });
}
